"use strict";
const pkj = require("../package.json");
const log = require("@czp-cli-test/log");
const {getNpmInfo,getNpmSemverVersion } = require("@czp-cli-test/get-npm-info");
const constant = require("./const");
const semver = require("semver");
const color = require("colors");
const rootCheck = require("root-check");
const userHome = require("user-home");
const pathExists = require("path-exists");
const minimist = require('minimist');
const dotenv = require('dotenv');
const path = require("path");

/**
 * 声明一个core函数导出
 */
function core  () {
  try {
    checkProjectVersion();
    checkNodeVersion();
    checkRoot();
    checkUserHome();
    checkInputArgs();
    log.verbose('DEBUG', 'Debug 模式启动');
    checkEnv();
    checkGlobalUpdate();
  } catch (e) {
    log.error(e.message);
  }
}

/**
 * 检查项目版本号
 */
function checkProjectVersion() {
  log.success("当前项目版本号：", pkj.version); // 从项目的package.json 文件里面拿到版本号
}

/**
 * 检查Node版本号
 */
function checkNodeVersion() {
  const currentVersion = process.version; // 获取当前项目运行的版本
  const lowestNodeVersion = constant.LOWEST_NODE_VERSION; // 从我们自己定义的常量里面拿到我们项目运行所需的最低版本号
  // 比较版本，如果过低抛出异常
  if (!semver.gte(currentVersion, lowestNodeVersion)) {
    throw new Error(
      color.red(`您需要安装 v${lowestNodeVersion} 以上版本的 Node.js`)
    );
  }
}

/**
 * 检查 root 版本号
 */
function checkRoot() {
  process.geteuid();
  rootCheck();
  // log.success(rootCheck()); // 此时没有输出，0
  // log.success(process.geteuid()); // 此时输出  501 ，表示权限等级， 0最大
}

/**
 * 检查用户目录
 */
function checkUserHome() {
  // pathExists 用来检测目录是否存在
  if (!userHome || !pathExists(userHome)) {
    throw new Error(color.red('当前用户目录不存在'));
  }
}

/**
 * 检查用户输入的参数
 */
function checkInputArgs() {
  const args = minimist(process.argv.slice(2));
  checkArgs(args);
}

function checkArgs(args) {
  if (args.debug) {
    process.env.LOG_LEVEL = 'verbose';
  } else {
    process.env.LOG_LEVEL = 'info';
  }
  log.level = process.env.LOG_LEVEL;
}
/**
 * 检查环境变量
 */
function checkEnv() {
  // 检验本地是否有 .env 文件
  const dotenvPath = path.resolve(userHome, '.env');
  // 路径存在才生成
  if (pathExists(dotenvPath)) {
    // dotenv 用于创建环境变量
    dotenv.config({
      path: dotenvPath,
    });
  }
  createDefaultEnvConfig();
  log.verbose('环境变量', process.env.CLI_HOME_PATH);
}

function createDefaultEnvConfig() {
  const cliConfig = {
    home: userHome,
  }
  if(process.env.CLI_HOME) {
    cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
  } else {
    cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

async function getVueData(){
  console.log(await getNpmInfo("vue"))
}

async function checkGlobalUpdate() {
  // 1.获取当前版本号和包名称
  const pkgName = pkj.name;
  const pkgVersion = pkj.version;
  // 2.调用npm api 获取线上版本信息
  console.log(pkgVersion, pkgName,'--->pkgVersion, pkgName')
  const lastVersion = await getNpmSemverVersion(pkgVersion, pkgName);
  console.log(lastVersion)
  // 3.提取所有版本号，对比
  if (lastVersion && semver.gt(lastVersion, pkgVersion)) {
    log.warn(color.yellow(`请手动更新1 ${pkgName} 当前版本：${pkgVersion}，最新版本${lastVersion}
        更新命令：npm install -g ${pkgName}`))
  }
}

module.exports = core;
